﻿#include <iostream>
using namespace std;


//队头删除，队尾插入
template<class T>
class Queue{				//队列类
public:
	Queue()
	{
		arr = new T[100];
		head=end=0;
	}

	void Append(T startU)
	{
		arr[end]=startU;
		end=(end+1)%maxSize;
	}
	T Front()
	{
		if(IsEmpty())return NULL;
		else
			return arr[head];
	}

	bool IsEmpty(){
		if(head==end)return true;
		else
			return false;
	}
	void Pop()
	{
		head=(head+1)%maxSize;				//将下标进一位  
	}

	void Output()
	{
		if(IsEmpty())							//如果队列为空就输出提示   
			cout<<"队列为空！！无数据输出！！";   
		for(int i=head;i!=end;)					//如果不为空就输出队列数据  
		{ 
			cout<<arr[i]<<" "; 
			i=(i+1)%maxSize;   
		}												//这里是循环队列，所以不能使用i++，要使用i=(i+1)%lon; 
		cout<<endl;											//可以保证下标永远不会超戒，因为循环队列下标位置是不确定的. 
	}     
private:
	T *arr;
	int maxSize;
	int head;
	int end;
};

void main()
{
	int a[]= {1,2,3,4,5,6,7,8,9,10};
	Queue<int> q;

	cout<<endl<<"开始入队！"<<endl;
	for(int i=0;i<sizeof(a)/4;i++)       //一个一个入队
	{
		q.Append(a[i]);
		q.Output();
	}

	cout<<endl<<"开始出队！"<<endl;
	for(int i=0;i<10;i++)				//一个一个出队
	{
		q.Pop();
		q.Output();
	}
}